/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Model;

import java.util.ArrayList;

/**
 *
 * @author manelv8
 */
public class CompatibilidadeTabel {

    private static boolean compara(int detem, int solicita) {
        if (table[solicita][detem] == 1) {
            return true;
        } else {
            return false;
        }
    }
    /**
     * RL UL WL IRL IUL IWL RL + - - + - - UL + - - + - - WL - - - - - - IRL + -
     * - + + + IUL + - - + + + IWL - - - + + +
     *
     */
    static final int[][] table = {
        {1, 0, 0, 1, 0, 0},
        {1, 0, 0, 1, 0, 0},
        {0, 0, 0, 0, 0, 0},
        {1, 0, 0, 1, 1, 1},
        {1, 0, 0, 1, 1, 1},
        {0, 0, 0, 1, 1, 1}
    };

    public static boolean isCompativel(BloqueioInfo detem, Operacao solicita, int tipoBloqueioSolicitante, Object obj) {
        String objeto = "";
        if (obj instanceof Tabela) {
            Tabela t = (Tabela) obj;
            objeto = t.getNome();
        } else if (obj instanceof Pagina) {
            Pagina p = (Pagina) obj;
            objeto = p.pageId;
        }else if (obj instanceof Tupla) {
            Tupla t = (Tupla) obj;
            objeto = t.getId();
        }
        if(detem.status == 2){
            return true;
        }else
        if (detem.transacaoId.equals(solicita.getTransacaoId())) { // se é a mesma transação TRUE
            return true;
        } else {//TRANSAÇOES DIFERENTES 
            if (detem.objeto.equals(objeto)) {//oBJETOS iguais
                return compara(detem.tipoBloqueio, tipoBloqueioSolicitante);
            } else {//objetos diferentes transaçoes diretentes
                Tabela tabela = null;
                Tupla tupla = null;
                Pagina pagina = null;

                if (obj instanceof Tabela) {
                    tabela = (Tabela) obj;

                } else if (obj instanceof Pagina) {
                     pagina = (Pagina) obj;

                }else if (obj instanceof Tupla) {
                    tupla = (Tupla) obj;

                }

                if (detem.granularidade == Granularidade.tupla) {

                    if (obj instanceof Tabela) {
                        ArrayList<Tupla> alTuplas = new ArrayList<Tupla>();
                        alTuplas.addAll(tabela.getPaginas().get(0).getTuplas());
                        alTuplas.addAll(tabela.getPaginas().get(1).getTuplas());

                        for (Tupla t : alTuplas) {
                            if (t.getId().equals(detem.objeto)) {
                                return compara(detem.tipoBloqueio, tipoBloqueioSolicitante);
                            }
                        }

                        return true;


                    } else if (obj instanceof Pagina) {
                        ArrayList<Tupla> alTuplas = new ArrayList<Tupla>();
                        alTuplas.addAll(pagina.getTuplas());
                       
                        for (Tupla t : alTuplas) {
                            if (t.getId().equals(detem.objeto)) {
                                return compara(detem.tipoBloqueio, tipoBloqueioSolicitante);
                            }
                        }

                        return true;
                    }else if (obj instanceof Tupla) {
                        if (tupla.getId().equals(detem.objeto)) {
                           return compara(detem.tipoBloqueio, tipoBloqueioSolicitante);
                        } else {
                            return true;
                        }
                    }
                } else if (detem.granularidade == Granularidade.pagina) {
                    if (obj instanceof Tabela) {
                        ArrayList<Pagina> alPaginas = new ArrayList<Pagina>();
                        alPaginas.add(tabela.getPaginas().get(0));
                        alPaginas.add(tabela.getPaginas().get(1));

                        for (Pagina p : alPaginas) {
                            if (p.getPageId().equals(detem.objeto)) {
                                return compara(detem.tipoBloqueio, tipoBloqueioSolicitante);
                            }
                        }

                        return true;


                    } else if (obj instanceof Pagina) {
                        if (pagina.getPageId().equals(detem.objeto)) {
                            return compara(detem.tipoBloqueio, tipoBloqueioSolicitante);
                        } else {
                            return true;
                        }
                    }else if (obj instanceof Tupla) {
                        if (tupla.getPage().getPageId().equals(detem.objeto)) {
                            return compara(detem.tipoBloqueio, tipoBloqueioSolicitante);
                        } else {
                            return true;
                        }
                    }

                } else if (detem.granularidade == Granularidade.tabela) {
                    if (obj instanceof Tabela) {
                        if (tabela.getNome().equals(detem.objeto)) {
                           return compara(detem.tipoBloqueio, tipoBloqueioSolicitante);
                        } else {
                            return true;
                        }





                    } else if (obj instanceof Pagina) {
                        if (pagina.getTabela().getNome().equals(detem.objeto)) {
                           return compara(detem.tipoBloqueio, tipoBloqueioSolicitante);
                        } else {
                            return true;
                        }
                    }else if (obj instanceof Tupla) {
                        if (tupla.getTabela().getNome().equals(detem.objeto)) {
                           return compara(detem.tipoBloqueio, tipoBloqueioSolicitante);
                        } else {
                            return true;
                        }
                    }

                }

            }





        }

     return true;
    }
}
